/**
 * 20220406
 * @ljy
 * 不要使用下面的路由导入，因为会触发eslint的dependency cycle via错误，即A依赖的B中的内容 ，B中也依赖的A中的内容。
 * 原因是某个组件在router文件中已经作为组件被引入，然后那个组件又引入了本文件，从而导致循环依赖错误。
 * 因此不在路径中直接跳转到登录页面，改为重新登录提示
 * import { useRouter } from 'vue-router';
 */
import axios from 'axios';
import router from '@/router';
import { ElMessage, ElMessageBox, ElLoading } from 'element-plus'; // element plus对话框
// 创建路由对象。
const instance = axios.create({
  timeout: 60000,
  responseType: 'json',
  headers: {
    'Content-Type': 'application/json;charset=UTF-8',
  },
});
// loading框设置局部刷新，且所有请求完成后关闭loading框
let loading;
function startLoading() {
  loading = ElLoading.service({
    lock: true,
    // spinner: 'refresh',
    customClass: 'create-isLoading',
    background: 'rgba(0, 0, 0, 0.7)',
    text: '努力加载中...',
  });
}
function endLoading() {
  if (loading != null) {
    loading.close();
  }
}
// 添加请求拦截器
instance.interceptors.request.use((config) => {
  let token = localStorage.getItem('access_token');
  if (token) {
    if (typeof config.headers !== 'undefined') {
      config.headers.access_token = token; // 携带token
    }
  }
  const path = router.currentRoute.value.fullPath; // 获取当前路由的路径
  if (path !== '/login') { // 登陆页面不需要加载
    startLoading();
  }
  // 加载对话框，要考虑出现异常的情况
  // startLoading();
  return config;
}, (error) => Promise.resolve(error.response));
// 添加服务器响应拦截器
instance.interceptors.response.use((response) => {
  // 关闭加载对话框
  endLoading();
  const { data } = response; // 获取返回的数据
  if (data.code !== 0) { // 如果服务端返回的是错误数据
    if (data.code === 401) { // 如果是没有登陆的请求
      ElMessageBox.alert(data.msg, '系统提示', {
        confirmButtonText: '确认',
      }).then((res) => {
        // 跳转到登录页面
        router.push('/login');
      });
      // window.location.reload();
    } else { // 如果是其他错误信息
      if (typeof data.msg === 'string') { // 如果有返回错误信息
        ElMessage({
          message: data.msg,
          grouping: true,
          type: 'error',
        });
      }
    }
  }
  return data; // 直接返回数据
}, (error) => {
  // 关闭加载对话框
  endLoading();
  if (error.response) { // 一般在服务器自定义了返回的http错误数据，就可以接收到。例如没有携带token或token非法
    const { status } = error.response; // 获取服务端的http错误码
    const { data } = error.response; // 获取服务端响应数据
    let title = '服务器异常'; // 错误提示对话框的标题
    if (data.code === 401) { // 如果是token错误或未携带
      title = 'token缺失';
      // 清除本地token
      localStorage.removeItem('access_token');
    } else { // 如果是其他异常
      title = '服务器异常';
    }
    ElMessage({
      message: data.msg,
      type: 'error',
    });
    // ElMessageBox.alert(data.msg, title, {
    //   confirmButtonText: '确认',
    // }).then((res) => {
    //   // 跳转到登录页面
    // });
  } else { // 如果不是服务端自定义的错误状态码，例如服务端没有设置跨域导致的访问异常
    ElMessage({
      message: `服务器异常:${error.response}`,
      grouping: true,
      type: 'error',
    });
  }
  // 对请求错误做些什么
  // 将错误信息返回
  // return Promise.reject(error);
  // 将错误信息返回，并用resolve来调用，即全部放到正常逻辑中进行处理
  return Promise.resolve(error.response.data);
});
export default instance;
// # sourceMappingURL=my_axios.js.map
